<?php

use Workerman\Worker;
use \Workerman\Lib\Timer;

require_once __DIR__ . '/../../../vendor/autoload.php';

// 心跳关闭连接
define('HEARTBEAT_TIME', 600);

// 初始化一个worker容器，监听1234端口
//,$context
$worker = new Worker('websocket.md://0.0.0.0:2000');

// ====这里进程数必须必须必须设置为1====
$worker->count = 1;
// 新增加一个属性，用来保存uid到connection的映射(uid是用户id或者客户端唯一标识)
$worker->uidConnections = array();
// 当有客户端发来消息时执行的回调函数
$worker->onMessage = function ($connection, $data) {
    static $request_count;
    // 业务处理略
    if (++$request_count > 10000) {
        // 请求数达到10000后退出当前进程，主进程会自动重启一个新的进程
        Worker::stopAll();
    }

    // die;
    //给用户设定一个ID，用户发送消息过来，存入到  redis或者 数据库。
    //然后下面 onWorkerStart 检查是否有uid
    //if (!isset($connection->id)) {

    if (isset($connection)) {
        $data =json_decode($data, true);
        //$data 有三个数据  1 uid， 2 msg 发送来的消息。3 type 类型
        $connection->data_info = $data['uid'];
        $this->uidConnections[$data['uid']] = $connection;

        return $connection->send('ID的存在：' .$data['uid'].'内容:'.$data['msg']);
    }
    //连接成功
    return $connection->send($data);
};

// 添加定时任务 每秒发送
$worker->onWorkerStart = function ($worker) {
    // 定时，每10秒一次
    Timer::add(1, function () use ($worker) {
        // 遍历当前进程所有的客户端连接，发送当前服务器的时间
        foreach ($worker->uidConnections as $connection) {
            //这个位置可以去查询 数据库或者redis 是否有消息过来。有就发送到客户端去
            $connection->send($connection->data_info['msg']);
        }
    });
};


// 当有客户端连接断开时
$worker->onClose = function ($connection) {
    global $worker;
    if (isset($connection->uid)) {
        $connection->close();
        // 连接断开时删除映射
        unset($worker->uidConnections[$connection->uid]);
        echo "断开连接";
    }
};

// 向所有验证的用户推送数据
function broadcast($message)
{
    global $worker;
    foreach ($worker->uidConnections as $connection) {
        $connection->send($message);
    }
}

// 针对uid推送数据
function sendMessageByUid($uid, $message)
{
    global $worker;
    if (isset($worker->uidConnections[$uid])) {
        $connection = $worker->uidConnections[$uid];
        $connection->send($message);
    }
}

// 运行所有的worker（其实当前只定义了一个）
Worker::runAll();